//
// Created by hay boy on 2022/6/26.
//

#ifndef ALGORITHMS_DERIVEDARRAYSTACK_H
#define ALGORITHMS_DERIVEDARRAYSTACK_H
#include "Stack.h"
#include "../array/ArrayList.cpp"
template<class T>
class DerivedArrayStack:private ArrayList<T>,public Stack<T>{
public:
    explicit DerivedArrayStack(int initialCapacity=10):ArrayList<T>(initialCapacity){}
    bool empty() const{
        return ArrayList<T>::empty();
    };
    int size()const{
        return ArrayList<T>::size();
    }
    T& top(){
        try{
            return ArrayList<T>::get(ArrayList<T>::size()-1);
        }catch(illegalIndex&){
            throw StackEmpty();
        }
//        if(ArrayList<T>::empty())
//            throw StackEmpty();
//        return get(ArrayList<T>::size()-1);
    }
    void pop(){
        if(ArrayList<T>::empty())
            throw StackEmpty();
        ArrayList<T>::erase(ArrayList<T>::size()-1);
    }
    void push(const T& theElement){
        ArrayList<T>::push_back(theElement);
    }
    void clear(){
        ArrayList<T>::listSize = 0;
    }
};
#endif //ALGORITHMS_DERIVEDARRAYSTACK_H
